Skip to content

03 Message组件

一、什么是Message组件

在LangChain中,Message组件是整个框架的核心数据结构之一,Message组件是整个上下文的载体,所有的用户输入大模型输出工具调用结果、最终都会被封装成Message对象进行传递,Message组件是Memory组件和LangGraph状态管理的基础。

二、消息的类型

在LangChain中将消息分为四种类型:

HumanMessage:用户输入的内容,对于支持多模态的LLM可以包含文本、图像、音频等形式的内容。

SystemMessage:系统提示词,可以定义角色、设定模型行为,为LLM提供上下文

AIMessage:LLM生成的相应内容,包括文本内容、工具调用信息、元数据信息

ToolMesssage:工具调用的结果

代码示例如下:

python
from datetime import datetime

import dotenv
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage, SystemMessage
from langchain.tools import tool

dotenv.load_dotenv()


# 1.定义工具及对应map
@tool
def get_current_time():
    """获取当前时间"""
    return datetime.now().strftime('%Y-%m-%d %H:%M:%S')


tools_map = {
    "get_current_time": get_current_time
}

# 2.创建model对象
model = init_chat_model(
    "deepseek-v4-flash"
)

# 3.定义消息列表
human_message = HumanMessage("你好,你是谁?现在什么时间?")
system_message = SystemMessage("你是一个知识问答机器人,你叫老K")
message_list = [human_message, system_message]

# 4.绑定工具
bind_tool_model = model.bind_tools([get_current_time])

# 5.调用LLM模型
ai_message = bind_tool_model.invoke(message_list)
message_list.append(ai_message)

# 6.判断是否有函数调用
if ai_message.tool_calls:
    tool_message = tools_map.get((ai_message.tool_calls[0].get("name"))).invoke(ai_message.tool_calls[0])
    # 7.将工具调用结果ToolMessage添加到消息列表
    message_list.append(tool_message)

# 7.再次调用model
ai_message = bind_tool_model.invoke(message_list)

print(ai_message.content)

执行结果如下:

image-20260608224903367

三、消息内容

3.1 content字段

在LangChain的消息类中,使用content属性来保存消息所承载的内容,但content是一个弱类型的属性,它可以用来保存字符串、对象列表等形式的信息。对于AIMessage类来说,content中保存了模型返回的原始内容信息。

现在很多LLM支持多模态,除了直接传递文本消息之外,我们还可以通过content传递图片消息:

python
# 传递字符串
human_message = HumanMessage("你好你是")

# 通过content传递多模态信息
human_message = HumanMessage(content=[
    {"type": "text", "text": "这张图片是哪个动漫人物?"},
    {"type": "image", "url": "https://image.baidu.com/a.jpg"}
])

3.2 content_blocks字段

在LangChain v1.0中,除了content能保存消息内容之外,还提供了统一不同模型提供商标准的content_blocks字段,该字段的作用是:为了屏蔽不同LLM厂商传入/返回数据格式的差异,统一返回格式相同的内容,让使用者不用再根据模型不同处理一些兼容逻辑,这部分内容LangChain在内部就帮我们封装好了。

在没有content_blocks之前,可能OpenAI返回这样的格式:

json
{
    "type":"reasoning",
    "summary":"..."
}

而Anthropic返回这样的格式:

json
{
    "type":"thinking",
    "thinking":"..."
}

每个厂商都有自己的格式,我们就需要写大量的判断逻辑

python
if openai:
    ...
if anthropic:
    ...
if gemini:
    ...

而现在从content_blocks中可以取到格式统一的信息

python
[
    {
        "type":"reasoning",
        "reasoning":"..."
    }
]

比如在HumanMessage中使用content_blocks来填充多模态信息。

python
# 通过content_block传递多模态信息
human_message = HumanMessage(content_blocks=[
    {"type": "text", "text": "这张图片是哪个动漫人物?"},
    {"type": "image", "url": "https://image.baidu.com/a.jpg"}
])

四、总结

在 LangChain 中,Message 组件用于保存对话消息。content 字段用于保存模型原始输入或输出内容,可能是字符串,也可能是 Provider 原生格式的数据结构。

content_blocks 字段是 LangChain 提供的标准化存储消息内容的字段,用于以统一格式访问消息内容。

由于 AIMessage 表示 LLM 的输出结果,因此, content_blocks 中通常会包含更丰富的内容类型,例如文本(text)、推理过程(reasoning)、工具调用(tool_call)、引用(citation)以及多模态等内容。